﻿// #region
//
// using System.Security.Claims;
// using System.Text;
// using System.Text.RegularExpressions;
// using IPTools.Core;
// using Microsoft.AspNetCore.Http;
// using UAParser;
// using Vin.Tool.Domain.SystemModel;
//
// #endregion
//
// namespace Vin.Tool.AspNetCore.Extension;
//
// /// <summary>
// /// HttpContext扩展类
// /// </summary>
// public static class HttpContextExtension
// {
//     /// <summary>
//     /// 是否是ajax请求
//     /// </summary>
//     /// <param name="request"></param>
//     /// <returns></returns>
//     public static bool IsAjaxRequest(this HttpRequest request)
//     {
//         if (request == null)
//         {
//             throw new ArgumentNullException(nameof(request));
//         }
//
//         //return request.Headers.ContainsKey("X-Requested-With") &&
//         //       request.Headers["X-Requested-With"].Equals("XMLHttpRequest");
//
//         return request.Headers["X-Requested-With"] == "XMLHttpRequest" ||
//                request.Headers["X-Requested-With"] == "XMLHttpRequest";
//     }
//
//     /// <summary>
//     /// 获取客户端IP
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static string GetClientUserIp(this HttpContext context)
//     {
//         var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
//         if (string.IsNullOrEmpty(result))
//         {
//             result = context.Connection.RemoteIpAddress?.ToString();
//         }
//
//         if (string.IsNullOrEmpty(result))
//             throw new Exception("获取IP失败");
//
//         if (result.Contains("::1"))
//             result = "127.0.0.1";
//
//         result = result.Replace("::ffff:", "");
//         result = result.Split(':')?.FirstOrDefault() ?? "127.0.0.1";
//         result = IsIp(result) ? result : "127.0.0.1";
//         return result;
//     }
//
//     /// <summary>
//     /// 判断是否IP
//     /// </summary>
//     /// <param name="ip"></param>
//     /// <returns></returns>
//     public static bool IsIp(string ip)
//     {
//         return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
//     }
//
//     /// <summary>
//     /// 获取登录用户id
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static long GetUId(this HttpContext context)
//     {
//         var uid = context.User.FindFirstValue(ClaimTypes.PrimarySid);
//         return !string.IsNullOrEmpty(uid) ? long.Parse(uid) : 0;
//     }
//
//     /// <summary>
//     /// 获取登录用户名
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static string? GetName(this HttpContext context)
//     {
//         var uid = context.User?.Identity?.Name;
//
//         return uid;
//     }
//
//     /// <summary>
//     /// ClaimsIdentity
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static IEnumerable<ClaimsIdentity> GetClaims(this HttpContext context)
//     {
//         return context.User.Identities;
//     }
//
//     public static string? GetUserAgent(this HttpContext context)
//     {
//         return context.Request.Headers["User-Agent"];
//     }
//
//     /// <summary>
//     /// 获取请求令牌
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static string? GetToken(this HttpContext context, string key = "Authorization")
//     {
//         return context.Request.Headers[key];
//     }
//
//     /// <summary>
//     /// 获取请求Url
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static string? GetRequestUrl(this HttpContext context)
//     {
//         return context.Request.Path.Value;
//     }
//
//     /// <summary>
//     /// 获取请求参数
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static string? GetQueryString(this HttpContext context)
//     {
//         return context.Request.QueryString.Value;
//     }
//
//     /// <summary>
//     /// 获取body请求参数
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static async Task<string> GetBody(this HttpContext context)
//     {
//         context.Request.EnableBuffering();
//         //context.Request.Body.Seek(0, SeekOrigin.Begin);
//         //using var reader = new StreamReader(context.Request.Body, Encoding.UTF8);
//         ////需要使用异步方式才能获取
//         //return reader.ReadToEndAsync().Result;
//         string body;
//         var buffer = new MemoryStream();
//         context.Request.Body.Seek(0, SeekOrigin.Begin);
//         await context.Request.Body.CopyToAsync(buffer);
//         buffer.Position = 0;
//         try
//         {
//             using StreamReader streamReader = new(buffer, Encoding.UTF8);
//             body = await streamReader.ReadToEndAsync();
//         }
//         finally
//         {
//             buffer.Dispose();
//         }
//
//         context.Request.Body.Seek(0, SeekOrigin.Begin);
//         context.Request.Body.Position = 0;
//
//         return body;
//     }
//
//     /// <summary>
//     /// 获取浏览器信息
//     /// </summary>
//     /// <param name="context"></param>
//     /// <returns></returns>
//     public static ClientInfo GetClientInfo(this HttpContext context)
//     {
//         var str = context.GetUserAgent();
//         var uaParser = Parser.GetDefault();
//         return uaParser.Parse(str);
//     }
//
//     /// <summary>
//     /// 根据IP获取地理位置
//     /// </summary>
//     /// <returns></returns>
//     public static string GetIpInfo(string ip)
//     {
//         var ipInfo = IpTool.Search(ip);
//         return ipInfo?.Province + "-" + ipInfo?.City + "-" + ipInfo?.NetworkOperator;
//     }
//
//     /// <summary>
//     /// 设置请求参数
//     /// </summary>
//     /// <param name="reqMethod"></param>
//     /// <param name="context"></param>
//     public static string GetRequestValue(this HttpContext context, string reqMethod)
//     {
//         string param = string.Empty;
//
//         if (HttpMethods.IsPost(reqMethod) || HttpMethods.IsPut(reqMethod) || HttpMethods.IsDelete(reqMethod))
//         {
//             param = context.GetBody().Result;
//             string regex = "(?<=\"password\":\")[^\",]*";
//             param = Regex.Replace(param, regex, "***");
//         }
//
//         if (string.IsNullOrEmpty(param))
//         {
//             param = context.GetQueryString() ?? "";
//         }
//
//         return param;
//     }
//
//     public static HttpContextClientDetailModel GetClientDetail(this HttpContext context)
//     {
//         var ip = context.GetClientUserIp();
//         var clientInfo = context.GetClientInfo();
//         var ipInfo = IpTool.Search(ip);
//         return new HttpContextClientDetailModel()
//         {
//             Ip = ip,
//             ClientInfo = clientInfo,
//             IpInfo = ipInfo,
//             Location = $"{ipInfo.Country} {ipInfo.Province} {ipInfo.City} {ipInfo.NetworkOperator}",
//             Browser = clientInfo.UA.ToString(),
//             Os = clientInfo.OS.ToString(),
//             UserAgent = clientInfo.String,
//         };
//     }
// }

